import { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit';
import axios from 'axios';

/**
 * 天气数据接口
 *
 * 表示单个天气数据记录，采用动态属性模式支持多种气象指标
 */
interface WeatherData {
  /** 数据记录ID */
  id: string;
  /** 关联的城市ID */
  cityId: string;
  /** 城市名称（可选） */
  cityName?: string;
  /** 数据记录时间 */
  recordedAt: string;
  /** 数据创建时间 */
  createdAt: string;
  /** 动态天气指标（温度、湿度、气压等） */
  [key: string]: any;
}

/**
 * 天气统计概览接口
 *
 * 系统整体的统计数据汇总
 */
interface WeatherStats {
  /** 总城市数量 */
  totalCities: number;
  /** 总天气记录数量 */
  totalWeatherRecords: number;
  /** 总用户数量 */
  totalUsers: number;
  /** 最近记录数量 */
  recentRecords: number;
  /** 活跃城市数量 */
  activeCities: number;
  /** 最后数据采集时间 */
  lastDataCollection?: string;
  /** 最后采集状态 */
  lastCollectionStatus: string;
}

/**
 * 统计数据接口
 *
 * 表示聚合统计数据的记录
 */
interface StatisticsData {
  /** 统计记录ID */
  id: string;
  /** 关联的城市ID */
  cityId: string;
  /** 统计类型（日、周、月等） */
  statisticType: string;
  /** 统计日期 */
  statisticDate: string;
  /** 数据点数量 */
  dataPointCount: number;
  /** 创建时间 */
  createdAt: string;
  /** 动态统计指标值 */
  [key: string]: any;
}

/**
 * 天气状态管理接口
 *
 * 管理天气数据、统计数据、实时数据等的状态
 */
interface WeatherState {
  /** 历史天气数据列表 */
  data: WeatherData[];
  /** 实时天气数据列表 */
  realtimeData: WeatherData[];
  /** 统计数据列表 */
  statistics: StatisticsData[];
  /** 统计概览数据 */
  stats: WeatherStats | null;
  /** 加载状态 */
  loading: {
    data: boolean;
    stats: boolean;
    statistics: boolean;
  };
  /** 错误信息 */
  error: string | null;
  /** 数据过滤条件 */
  filters: {
    cityId?: string;
    startDate?: string;
    endDate?: string;
  };
}

/**
 * 初始状态
 */
const initialState: WeatherState = {
  data: [],
  realtimeData: [],
  statistics: [],
  stats: null,
  loading: {
    data: false,
    stats: false,
    statistics: false,
  },
  error: null,
  filters: {},
};

/**
 * 异步Action：获取天气数据
 *
 * 支持按城市、时间范围、分页等条件查询天气数据
 */
export const fetchWeatherDataAsync = createAsyncThunk(
  'weather/fetchData',
  async (params: { cityId?: string; startDate?: string; endDate?: string; page?: number; pageSize?: number }) => {
    const queryParams: any = {
      page: params.page || 1,
      pageSize: params.pageSize || 100,
      ...params
    };

    const response = await axios.get('http://localhost:5197/api/weather', { params: queryParams });

    const responseData = response.data;
    if (responseData && Array.isArray(responseData.data)) {
      return responseData.data;
    } else if (Array.isArray(responseData)) {
      return responseData;
    } else {
      return [];
    }
  }
);

/**
 * 异步Action：获取统计概览
 *
 * 获取系统整体的统计概览数据
 */
export const fetchStatsAsync = createAsyncThunk(
  'weather/fetchStats',
  async () => {
    const response = await axios.get('http://localhost:5197/api/statistics/overview');
    return response.data;
  }
);

/**
 * 异步Action：获取统计数据
 *
 * 获取指定城市和时间范围内的聚合统计数据
 */
export const fetchStatisticsAsync = createAsyncThunk(
  'weather/fetchStatistics',
  async (params: { cityId: string; startDate?: string; endDate?: string }) => {
    const url = `http://localhost:5197/api/weather/statistics/range/${params.cityId}`;
    const queryParams: any = {};

    if (params.startDate) queryParams.startDate = params.startDate;
    if (params.endDate) queryParams.endDate = params.endDate;

    const response = await axios.get(url, { params: queryParams });
    return response.data || [];
  }
);

/**
 * 异步Action：模拟数据采集
 *
 * 用于测试和演示的模拟天气数据采集功能
 */
export const simulateDataCollectionAsync = createAsyncThunk(
  'weather/simulateDataCollection',
  async (params: { baseTemperature?: number; count?: number } = {}) => {
    const response = await axios.post('http://localhost:5197/api/weather/simulate', {
      baseTemperature: params.baseTemperature || 20,
      count: params.count || 3
    });
    return response.data;
  }
);

/**
 * 天气数据状态管理Slice
 *
 * 管理天气数据、统计数据、实时数据等的状态和异步操作
 */
const weatherSlice = createSlice({
  name: 'weather',
  initialState,
  reducers: {
    /** 添加实时天气数据（保持最新10条） */
    addRealtimeData: (state, action: PayloadAction<WeatherData>) => {
      state.realtimeData = [action.payload, ...state.realtimeData.slice(0, 9)];
    },
    /** 清除实时天气数据 */
    clearRealtimeData: (state) => {
      state.realtimeData = [];
    },
    /** 设置数据过滤条件 */
    setFilters: (state, action: PayloadAction<Partial<WeatherState['filters']>>) => {
      state.filters = { ...state.filters, ...action.payload };
    },
    /** 清除数据过滤条件 */
    clearFilters: (state) => {
      state.filters = {};
    },
    /** 清除错误信息 */
    clearError: (state) => {
      state.error = null;
    },
  },
  extraReducers: (builder) => {
    builder
      // 获取天气数据状态处理
      .addCase(fetchWeatherDataAsync.pending, (state) => {
        state.loading.data = true;
        state.error = null;
      })
      .addCase(fetchWeatherDataAsync.fulfilled, (state, action) => {
        state.loading.data = false;
        state.data = action.payload;
      })
      .addCase(fetchWeatherDataAsync.rejected, (state, action) => {
        state.loading.data = false;
        state.error = action.error.message || '获取天气数据失败';
      })
      // 获取统计概览状态处理
      .addCase(fetchStatsAsync.pending, (state) => {
        state.loading.stats = true;
      })
      .addCase(fetchStatsAsync.fulfilled, (state, action) => {
        state.loading.stats = false;
        state.stats = action.payload;
      })
      .addCase(fetchStatsAsync.rejected, (state, action) => {
        state.loading.stats = false;
        state.error = action.error.message || '获取统计数据失败';
      })
      // 获取统计数据状态处理
      .addCase(fetchStatisticsAsync.pending, (state) => {
        state.loading.statistics = true;
      })
      .addCase(fetchStatisticsAsync.fulfilled, (state, action) => {
        state.loading.statistics = false;
        state.statistics = action.payload;
      })
      .addCase(fetchStatisticsAsync.rejected, (state, action) => {
        state.loading.statistics = false;
        state.error = action.error.message || '获取统计数据失败';
      })
      // 模拟数据采集状态处理
      .addCase(simulateDataCollectionAsync.fulfilled, (state) => {
        // 模拟成功后，可以触发数据刷新
      });
  },
});

export const { 
  addRealtimeData, 
  clearRealtimeData, 
  setFilters, 
  clearFilters, 
  clearError 
} = weatherSlice.actions;

export default weatherSlice.reducer;